// =====================================================================================
// 
//       Filename:  GiocatoreUmano.cpp
// 
//    Description:  Implementazione della classe GiocatoreUmano
// 
//         Author:  Davide Poletti , davide.pole@gmail.com
//					Paolo Pigato , p.pigato@hotmail.com	
//        Company:  P&P.cpp
// 
// =====================================================================================

#include "GiocatoreUmano.hh"

GiocatoreUmano::GiocatoreUmano(int dim_mare) : Giocatore(dim_mare) 
{;}

GiocatoreUmano::~GiocatoreUmano()
{
    delete _nave_colpite;
    delete _nave_affondate;
    list<Nave*>::iterator nave;
    for (nave = _navi_mie.begin(); nave != _navi_mie.end(); nave++){
        delete (*nave);
    }
}


pair<int, int> GiocatoreUmano::chiede_coordinate(){
    int x, y;
    pair<int, int> coor;
    cout << "Inserisci le coordinate" << endl;
    cout << "x: ";
    cin >> x ;
    cout << "y: ";
    cin >> y;     
    coor = pair<int, int>(x -1, y -1);
    while (!_mare_mio.in_mare(coor)){
		cout << "Queste coordinate non sono nel mare. Inseriscine di diverse." << endl;
		cout << "x: ";
    	cin >> x ;
    	cout << "y: ";
    	cin >> y;     
    	coor = pair<int, int>(x -1, y -1);
	}  
    return coor;
}


int GiocatoreUmano::chiede_dim_nave(){
    int dim_nave;
    do{
        cout << "Dimensione della nave:(1-5) " << endl;
        cin >> dim_nave;
    } while (dim_nave < 1 || dim_nave > 5);
    return dim_nave;
}

int GiocatoreUmano::chiede_orientamento(){
    int orientamento;
    do{
        cout << "Orientamento: " << endl << "0 = giù" << endl << "1 = destra" 
             << endl << "2 = su" << endl << "3 = sinistra" << endl;
        cin >> orientamento;
    } while (orientamento < 0 || orientamento > 3);
    return orientamento;
}

pair<int, int> GiocatoreUmano::spara()
{
    cout << "Il tuo mare" << endl;
    cout << _mare_mio << endl;
    cout << "Il mare avversario" << endl;
    cout << _mare_avv << endl;
    cout << "Spara nel mare avversario!" << endl;
    pair<int, int> coor = chiede_coordinate();
    while (_mare_avv[coor]->sparata()){	
        cout << "Hai già sparato in questa casella, dammene un'altra!" << endl;
        coor = chiede_coordinate();
    } 
    return coor;
}

int GiocatoreUmano::posiziona_nave()
{
    bool vuoi_nave = true;
    char scelta;
    Nave* nave;
    bool test;
    int dim_nave;
    pair<int, int> posizione;
    int orientamento;
    while (vuoi_nave) {
        cout << _mare_mio << endl;
        cout << "Vuoi inserire una nave?(S/n) ";
        cin >> scelta;
        switch (scelta){
            case 'n' : vuoi_nave = false;
                       return 0;

            default : do{
                          dim_nave = chiede_dim_nave();
                          posizione = chiede_coordinate();
                          orientamento = chiede_orientamento();
                          test = _mare_mio.ci_sta_nave(posizione,orientamento,dim_nave);
                          if (!test){
                              cout << "Non puoi inserire una nave in questo modo" << endl;
                          }
                      } while (!test);
                          nave = crea_nave(dim_nave, posizione, orientamento);
                          _navi_mie.push_back(nave);
                          _mare_mio.inserisci_nave(nave);
                          return dim_nave;
        } 
    }
}

int GiocatoreUmano::posiziona_nave(int dim_nave)
{
    cout << "Inserisci una nave di dimensione " << dim_nave << endl;
    cout << _mare_mio << endl;
    pair<int, int> posizione;
    int orientamento;
    bool test;
    do{
        posizione = chiede_coordinate();
        orientamento = chiede_orientamento();
        test = _mare_mio.ci_sta_nave(posizione,orientamento,dim_nave);
        if (!test){
            cout << "Non puoi inserire una nave in questo modo" << endl;
        }
    } while (!test);
    Nave* nave = crea_nave(dim_nave, posizione, orientamento);
    _navi_mie.push_back(nave);
    _mare_mio.inserisci_nave(nave);
    return dim_nave;
}
